<%@page import="com.hyrt.mckinsey.comm.utils.UUIDUtils"%>
<%@page import="java.math.BigDecimal"%>
<%@page import="com.hyrt.mckinsey.transaction.service.TransactionFlowService"%>
<%@page import="com.hyrt.mckinsey.webuser.service.WebUserService"%>
<%@page import="com.hyrt.mckinsey.consultation.service.ConsultationService"%>
<%@page import="com.hyrt.mckinsey.comm.utils.SmsTool"%>
<%@page import="com.hyrt.mckinsey.comm.utils.StringTools"%>
<%@page import="org.springframework.web.context.WebApplicationContext"%>
<%@page import="org.springframework.web.context.ContextLoader"%>
<%
/* *
 功能：支付宝服务器异步通知页面
 版本：3.3
 日期：2012-08-17
 说明：
 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。

 //***********页面功能说明***********
 创建该页面文件时，请留心该页面文件中无任何HTML代码及空格。
 该页面不能在本机电脑测试，请到服务器上做测试。请确保外部可以访问该页面。
 该页面调试工具请使用写文本函数logResult，该函数在com.alipay.util文件夹的AlipayNotify.java类文件中
 如果没有收到该页面返回的 success 信息，支付宝会在24小时内按一定的时间策略重发通知
 //********************************
 * */
%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="com.alipay.util.*"%>
<%@ page import="com.alipay.config.*"%>
<%@ page import="com.hyrt.mckinsey.webuser.service.WebUserExtendService" %>
<%@ page import="com.hyrt.mckinsey.webusercrowd.service.WebUserCrowdService" %>
<%@ page import="com.hyrt.mckinsey.comm.model.*" %>
<%@ page import="com.hyrt.mckinsey.tutorstudent.service.TutorStudentService" %>
<%
	//获取支付宝POST过来反馈信息
	Map<String,String> params = new HashMap<String,String>();
	Map requestParams = request.getParameterMap();
	for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
		String name = (String) iter.next();
		String[] values = (String[]) requestParams.get(name);
		String valueStr = "";
		for (int i = 0; i < values.length; i++) {
			valueStr = (i == values.length - 1) ? valueStr + values[i]
					: valueStr + values[i] + ",";
		}
		//乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
		//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
		params.put(name, valueStr);
	}
	
	//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
	//商户订单号
	String out_trade_no = new String(request.getParameter("out_trade_no"));

	//支付宝交易号
	String trade_no = new String(request.getParameter("trade_no"));

	//交易状态
	String trade_status = new String(request.getParameter("trade_status"));
	
	//交易人民币金额
	String total_fee = new String(request.getParameter("total_fee"));

	//公用回传参数（1：购买	2：职业咨询悬赏	3：行业咨询提问）
	String extra_common_param = new String(request.getParameter("extra_common_param"));
	
	//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//

	if(AlipayNotify.verify(params)){//验证成功
		//////////////////////////////////////////////////////////////////////////////////////////
		//请在这里加上商户的业务逻辑程序代码

		//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
		
		if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
			//判断该笔订单是否在商户网站中已经做过处理
				//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
				//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
				//如果有做过处理，不执行商户的业务程序
			if(!StringTools.isEmptyOrNull(extra_common_param) && extra_common_param.equals("1")) { //课程购买
				// 处理课程购买相关业务逻辑
				
				
			} else if(!StringTools.isEmptyOrNull(extra_common_param) && extra_common_param.equals("2")) { //咨询悬赏
				// 处理职业咨询悬赏相关业务逻辑
				WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
				ConsultationService consultationService =  (ConsultationService)wac.getBean(ConsultationService.class); // 职业咨询业务逻辑对象
				WebUserService webUserService =  (WebUserService)wac.getBean(WebUserService.class); // 网站用户业务逻辑对象
				TransactionFlowService transactionFlowService =  (TransactionFlowService)wac.getBean(TransactionFlowService.class); // 交易流水业务逻辑对象
				// 修改咨询悬赏支付状态
				consultationService.updateIndustryStatus(out_trade_no, 2);
				// 添加交易流水信息
				IndustryConsulting industryConsulting = consultationService.selectIndustryById(out_trade_no);
				if(industryConsulting!=null && !StringTools.isEmptyOrNull(industryConsulting.getCreator())) {
					WebUser webUser = webUserService.selectByPrimaryKey(industryConsulting.getCreator());
					if(webUser!=null && !StringTools.isEmptyOrNull(webUser.getPhone())) {
						TransactionFlow transactionFlow = new TransactionFlow();
						transactionFlow.setId(UUIDUtils.getUUID());
						transactionFlow.setConsumerItem(2); //消费项目（1、购买课程		2、行业咨询	3、悬赏问答	4、众筹）
						transactionFlow.setOrderId(out_trade_no); //订单ID
						transactionFlow.setTransactionNo(trade_no); //交易单号
						transactionFlow.setDesc("悬赏问题：" + industryConsulting.getTitle()); //详情描述
						transactionFlow.setMoney(new BigDecimal(total_fee)); //交易金额
						transactionFlow.setType(2); //收支类型（1、收入	2、支出）
						transactionFlow.setCreator(webUser.getId()); //交易人ID
						transactionFlow.setCreatorName(webUser.getLastNameZh()+webUser.getFirstNameZh()); //交易人姓名
						transactionFlow.setCreatorPhone(webUser.getPhone()); //交易人手机号
						transactionFlow.setTransactionTime(new Date()); //交易时间
						transactionFlowService.insert(transactionFlow);
					}
				}
			} else if(!StringTools.isEmptyOrNull(extra_common_param) && extra_common_param.equals("3")) { //咨询提问
				// 处理行业咨询提问相关业务逻辑
				WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
				ConsultationService consultationService =  (ConsultationService)wac.getBean(ConsultationService.class);
				WebUserService webUserService =  (WebUserService)wac.getBean(WebUserService.class);
				// 修改提问支付状态
				consultationService.updateIndustryStatus(out_trade_no, 2);
				// 发送消息给导师
				IndustryConsulting industryConsulting = consultationService.selectIndustryById(out_trade_no);
				WebUser webUser = webUserService.selectByPrimaryKey(industryConsulting.getAsking());
				SmsTool.sendSms(webUser.getPhone(), "您有新的提问，请登录系统查看"); // 调用短信接口发送短信
			}else if(!StringTools.isEmptyOrNull(extra_common_param) && extra_common_param.equals("4")) { //众筹导师
				// 处理众筹导师相关业务逻辑
				WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
				WebUserCrowdService webUserCrowdService=(WebUserCrowdService)wac.getBean(WebUserCrowdService.class);
				//更新支付状态
				webUserCrowdService.paySuccess(out_trade_no);
				WebUserCrowd webUserCrowd=webUserCrowdService.selectByPrimaryKey(out_trade_no);
				WebUserExtendService webUserExtendService=(WebUserExtendService)wac.getBean(WebUserExtendService.class);
				TutorStudentService tutorStudentService=(TutorStudentService)wac.getBean(TutorStudentService.class);
				WebUserExtend webUserExtend=webUserExtendService.selectByUserId(webUserCrowd.getmysteryTeacherId());
				if(webUserExtend.getRaiseMoney()>=webUserExtend.getTeacherPrice()){
					//如果该导师已筹集金额达到设定金额，则开放该导师
					webUserExtendService.enableTeacherById(webUserExtend.getId());
					//导师开放之后，将参与众筹的学生与该老师关联。
//					TutorStudent ts=new TutorStudent();
					WebUserCrowd crowdParams=new WebUserCrowd();
					crowdParams.setmysteryTeacherId(webUserCrowd.getmysteryTeacherId());
					crowdParams.setPayStatus(1);
					List<WebUserCrowd> webusercrowds= webUserCrowdService.selecAllByParams(crowdParams);
					for(WebUserCrowd wc:webusercrowds){
						TutorStudent ts=new TutorStudent();
						ts.setCreateTime(new Date());
						ts.setFlag(1);
						ts.setStudentId(wc.getDimaWebUserCrowdId());
						ts.setTutorId(wc.getmysteryTeacherId());
						tutorStudentService.save(ts);
					}

				}
			}
			
		}	

		//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
			
		out.print("success");	//请不要修改或删除

		//////////////////////////////////////////////////////////////////////////////////////////
	}else{//验证失败
		out.println("fail");
	}
%>
